# 导入Django内置的用户模型和用户管理器
from django.contrib.auth.models import  AbstractUser,BaseUserManager
# 导入Django的模型模块
from django.db import models
# 导入Django的URL反向解析模块
from django.urls import reverse
# 导入ShortUUIDField用于生成短UUID
from shortuuidfield import ShortUUIDField


# 定义Category模型，用于表示商品分类
class Category(models.Model):
    # 分类名称，最大长度200，设置为数据库索引
    name = models.CharField(max_length=200, db_index=True)
    # 分类的slug，用于URL，最大长度200，设置为数据库索引且唯一
    slug = models.SlugField(max_length=200, db_index=True, unique=True)

    # 定义模型的元数据
    class Meta:
        # 设置默认排序字段为name
        ordering = ('name',)
        # 设置模型在Django管理界面的单数名称
        verbose_name = 'category'
        # 设置模型在Django管理界面的复数名称
        verbose_name_plural = 'categories'

    # 定义对象的字符串表示，返回分类名称
    def __str__(self):
        return self.name

    # 获取分类的绝对URL，用于反向解析到商品列表视图
    def get_absolute_url(self):
        return reverse('shop:product_list_by_category', args=[self.slug])


# 定义Product模型，用于表示商品
class Product(models.Model):
    # 外键关联到Category模型，related_name用于反向查询，on_delete设置级联删除
    category = models.ForeignKey(Category, related_name='products',on_delete=models.CASCADE)
    # 商品名称，最大长度200，设置为数据库索引
    name = models.CharField(max_length=200, db_index=True)
    # 商品的slug，用于URL，最大长度200，设置为数据库索引
    slug = models.SlugField(max_length=200, db_index=True)
    # 商品图片，上传到指定路径，可以为空
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    # 商品描述，可以为空
    description = models.TextField(blank=True)
    # 商品价格，最大10位，小数点后2位
    price = models.DecimalField(max_digits=10, decimal_places=2)
    # 商品库存，正整数
    stock = models.PositiveIntegerField()
    # 商品是否可用，默认为True
    available = models.BooleanField(default=True)
    # 商品创建时间，自动设置为当前时间
    created = models.DateTimeField(auto_now_add=True)
    # 商品最后更新时间，自动更新为当前时间
    updated = models.DateTimeField(auto_now=True)

    # 定义模型的元数据
    class Meta:
        # 设置默认排序字段为创建时间的倒序
        ordering = ('-created',)

    # 定义对象的字符串表示，返回商品名称
    def __str__(self):
        return self.name

    # 获取商品的绝对URL，用于反向解析到商品详情视图
    def get_absolute_url(self):
        return reverse('shop:product_detail', args=[self.id, self.slug])



